FB101 : Mr.Postman

posted on 25 Apr 2010 03:39 by phnx--

Edit : ส่วนของ link ครับ เปลี่ยนข้อมูลตาม  [] ด้วยนะครับ

ห่างการอัพบล๊อกมาเกือบครบ 1 ปีเต็ม!! ไ่ม่ได้หายไปไหนครับวนเวียนอยู่แถวนี้แหละ
แค่ไม่มีวัตถุดิบมาเขียน ^^"

หนึ่งปีมานี social network ในไทยโตกว่าเดิมเยอะมากนะครับ ใครยังไม่เคยเล่น facebook
ยกมือขึ้น ( - - )/ น้อยมากครับน้อยมาก แล้วยิ่งใช้กันมากจะมามัวใช้ทุกอย่าง
ตามคนอื่นมันก็ไม่เท่ใช่มั้ยครับ :P

เคยเห็นอะไรคล้ายๆแบบนี้รึเปล่า?

ช่วงนี้กำลังเล่น facebook app อยู่นิดหน่อยครับถึงจุดที่อยากเขียนอะไรลงไปใน
wall ตัวเอง (และชาวบ้าน) ก็ค้นๆ ขุดๆอยู่วันสองวัน เจอปัญหาอะไรแปลกๆ น่าสนใจดี

ความยุ่งยากของการสร้าง app เท่ๆ ที่จะมีชื่อขึ้นเวลาไป post ลงใน wall ตัวเอง
อยู่ที่ระบบรักษาความเป็นส่วนตัวของ facebook ครับ ต้องมีการขอ token 2 รอบ
ในส่วนของ app และต้องขอสิทธิ์การส่งข้อมูล 2 ทางจาก application user
ในส่วนแรกนี้เองที่ผมเจอปัญหา เท่าที่ค้นจาก blog ที่มีคนทำบางครั้งก็เจอแบบที่
เหมือนจะดี อธิบายได้ครบ แต่พอมาลองทำตามแล้วมันไม่ผ่าน - -" เพราะมันต้องใช้
facebook client library ซึ่ง tutorial บางที่ก็แกล้งทำเป็นลืมอธิบาย บางที่ก็ให้ code
ผิดมา ก็ต้องมา debug ใหม่ เผื่อมีคนสนใจจะได้ไม่ต้องเหนื่อยครับ เริ่มเลย ><

requirement
มี app บน facebook (ก็ create application ธรรมดาๆ ไม่มีอะไรมากครับ จะตั้งเป็น iframe
หรือ fbml ก็ได้ จุดที่สนใจคราวนี้ไม่ได้อยู่ที่ตัว app ตรงๆ)

* ต่อไปนี้ถ้าเป็น นั่นคือให้แทนที่ด้วยข้อมูลตามที่อยู่ใน [ ] นะครับ

แรกสุดก็เป็นการขอสิทธิ์จาก app ถึง user ให้สามารถส่งข้อมูลผ่าน app โดยใช้
user id ได้ มีขั้นตอน (แบบ manual) ให้ทดลองกันดังนี้ครับ

- อนุญาตให้มีการเขียนข้อมูลผ่าน app ลงใน wall ของเรา รวมทั้งลงใน wall คนอื่น
(ที่ต้องอนุญาตแบบเดียวกัน) ด้วยการเข้าไปที่

http://www.facebook.com/connect/prompt_permissions.php?
api_key=
[API_KEY]&v=1.0&next=http://www.facebook.com/connect/login_success.html?
xxRESULTTOKENxx&display=popup&ext_perm=read_stream,publish_stream&enable_profile_selector=1 

จะได้หน้าเว็บประมาณนี้ครับ

ทำตามขั้นตอนกด allow ไปเรื่อยๆ (2 ครั้ง) จนมันขึ้น success

 

ก็จะพบว่า app ของเราไปโผล่อยู่ใน application settingsเรียบร้อย



หน้าการอนุญาตสิทธิ์นี้ถ้าคุ้นๆ อาจเคยเห็นมันลอยอยู่เป็น box เล็กๆเวลาใช้
application บางตัว นั่นคือผู้พัฒนาใช้ fbml เรียกมันให้โผล่มาระหว่างการใช้ app
แต่ในคราวนี้เราจะทำทุกอย่างเป็น manual ครับ ให้เห็นภาพไว้ก่อน (เหมือนจะแก้ตัว :P)

ณ จุดนี้เมื่อ user ให้สิทธิ์กับ application เพื่อส่งผ่านข้อมูลแล้วต่อไปก็จะไปทำงานกับ
application ให้สามารถระบุต้นทาง - ปลายทาง รวมถึงข้อมูลที่จะ post ลงใน wall กันต่อไปครับ

หลักการจะเขียนลง wall post ทั้งของ page หรือของ user ใน facebook ทำได้ผ่าน api
ที่เรียกรวมๆ ว่าการทำ stream ครับ ก่อนจะได้ stream มาใช้ก็ต้องขอ session ให้ app
ผูกกับ user ของเราก่อน ดังนี้ครับ

- เราต้องเอา api key ของ app (ได้จากตอนสร้าง app - หน้า my application ใน
developer page) ไปขอ token session key เพื่อจะขอ permanent session key
ให้สามารถใช้งาน stream ผ่าน session ของ app ที่เราสร้างขึ้นครับ

ขั้นตอนแรกคือขอ login code หรือ session ขั่วคราว เป็นอักษร 6 หลัก จะได้จาก url นี้ครับ
https://login.facebook.com/code_gen.php?api_key=[API_KEY]&v=1.0


จริงๆแล้ว ถ้าทำ app เองเนี่ย ส่วนใหญ่ก็จะผ่านการ authorize เพื่อเข้าใช้ app
ครั้งแรกไปแล้ว อาจจะไม่มีข้อความขออนุญาตใช้ profile เหลือแค่ get login code
ก็ปกติครับ เป็นแบบนี้ไปเลย


กด generate จะได้ code 6 หลัก ตามรูปครับ ใช้แค่ชั่วคราว ครั้งเดียว (generate ใหม่ได้)


จากนั้นก็จะยากขึ้นนิดนึงครับ

เราต้องเอา token ที่ได้ไปสร้าง permanent key ก็สร้าง php ขึ้นมาไฟล์นึง
คล้ายๆกับตอนทำ app เพราะต้อง include facebook.php จาก client library
มาใช้ด้วย ไฟล์นี้จะถูกเรียกใช้ได้แค่ครั้งเดียวครับ เพราะ token มันเป็น
แบบชั่วคราวนั่นเอง (พลาดไปก็ไปกดขอใหม่จากขั้นแรก)


ไฟล์ที่จะสร้าง มีดังนี้ครับ

 
    require_once '/facebook.php';
    $FB_APIKEY="";
    $FB_SECRET="";
    $fb = new FacebookRestClient($FB_APIKEY, $FB_SECRET);
    $testtoken= "WG654I";  /* เป็น session key ที่ได้มาเมื่อสักครู่ครับ
ใส่ตามตัวอย่างจะได้เห็นภาพ */
    $result = $fb->call_method('facebook.auth.getSession',
                                array('auth_token' => $testtoken,
                                      'generate_session_secret' => true));
    //print_r($result);
    echo $result['session_key'];

การเอา file นี้ไปรันก็แล้วแต่ความสะดวก อาจรันใน server ที่เก็บ app จริง
หรือจะรันใน localhost ก็ได้ ขอแค่ include client library ได้ก็พอครับ

จะได้ secret-session ยาวๆแบบนี้ (ต้อง censor แล้วจะเหลืออะไรให้ดู - -")

เข้าใกล้ความจริงไปอีกนิดนึงครับ ขั้นต่อไปก็เป็นการสร้าง data ที่จะ
post ลง wall ของ user คนนี้

    include_once "php/facebook.php";

    $api_key = "";
    $secret_key = "";
    $secret_session = "";
    $target_id = ""; /*user ปลายทาง*/
    $uid = ""; /*user ต้นทาง (คนที่จะมีรูปตัวเองใน post)*/
   
    try {
        $facebook = new Facebook($api_key, $secret_key);
        $facebook->api_client->session_key = $secret_session;
        $message = "";
        $attachment = array( "name" => "calendarus*","description" => "calendarus* wall post testing");
        $attachment = json_encode($attachment);
        if($facebook->api_client->stream_publish($message, $attachment, null,$target_id,$uid))
            echo "post to ".$target_id;
       
    } catch(Exception $e) {
            echo $e . "
";
    }

อธิบาย function ในไฟล์นะครับ จะมีแค่ส่วนเดียวที่ใช้ส่ง data ลง stream
คือ stream_publish(..)

ใช้ parameter ดังนี้ครับ
    - message ถ้าเทียบกับ post ของ app ประเภท quiz (ที่ทำกันบ่อยๆ)
message คือ comment อยู่บนสุดของแต่ละ post (ยาวได้ไม่เกิน 420 ตัวอักษรครับ)
    - attachment อาจแนบ link รูป - ไฟล์ vdo ไปกับ post ได้ ในรูปของ JSON
(เอ้อออ คร่าวๆ คือ การเก็บ data ในรูปแบบของ array ที่มี format string ใช้กันใน
javascript เรื่องนี้ก็น่าสนใจนะ อาจเขียนเป็นตอนใหม่) ดู format ของ attachment ได้จาก http://wiki.developers.facebook.com/index.php/Attachment_%28Streams%29 ครับ

    - action_links คล้ายๆ attachment ต้องเป็น json เหมือนกัน
    - target_id    facebook user id หรือ page id ที่จะไป post ไว้บน wall ถ้าไม่ใส่
จะ post ลงไปใน wall ของ uid
    - uid user id เท่านั้น เป็น page id ไม่ได้ครับ (page เขียนลง wall ของ user ไม่ได้)
   - privacy จะบอกว่าใครสามารถเห็น post นี้ได้บ้าง (เวลาไป post wall คนอื่นก็จะเห็น
ที่เป็นรูปแม่กุญแจ) มีรายละเอียดพอสมควร ไม่น่าจะเป็นประเด็น ถ้าสนใจเพิ่มเติมก็ http://wiki.developers.facebook.com/index.php/Stream.publish เลยครับ :D

parameter บางตัวเช่น action_links อาจไม่ระบุโดยปล่อยเป็น null หรือ ""
ไว้ตามตัวอย่างก็ได้ครับ

มีข้อแม้อยู่นิดหน่อยคือทั้ง uid และ target_id ต้องเป็น user หรือ page
(ในกรณีของ target_id) ที่อนุญาตให้  app ของเราเขียนข้อมูลลงบน wall ตัวเองได้
และยอมให้ใช้ id ของตัวเองเขียนข้อมูลผ่าน app ไปยัง wall คนอื่น
(รวมทั้ง wall ตัวเอง) ตามขั้นตอนแรก ไว้ล่วงหน้าแล้ว ถ้าปล่อยว่างไว้ทั้งสองค่า
จะเป็นการส่งกลับไปหาเจ้าของ id ที่สร้าง permanent session key

ตัวอย่าง post ที่ส่งไปหา target_id อื่น


แต่ในการทำงานจริงนั้นเราคงไม่ manual ส่ง wall post ให้ทุกคนด้วยตัวเอง
ดังนั้น ก็ต้องเขียนให้ระบบสามารถ get permission ของ userที่เข้ามาใช้ app ได้
เพื่อจะให้ user สามารถใช้ app ของเราส่ง wall post ไปยัง wall ของตัวเอง

นอกจากนี้ยังมีรูปแบบการ post แบบอื่นๆ เช่น post จาก app ไป wall เลย
(แบบผล quiz หรือ fortune teller ทำนองนั้น) อีกนะครับ  เรื่องรายละเอียด code
แบบอัติโนมัติรวมถึงการ post อื่นๆ จะตามมาลงเพิ่มให้ครั้งหน้าครับ (ถ้าไม่ขี้เกียจนะ) :D


edit @ 25 Apr 2010 04:41:46 by phnx

edit @ 2 May 2010 02:04:47 by phnx